package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.Gastos;

public class GastosDAO {

    private Connection conexion;

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    public Gastos buscar(int codigo) {
        Gastos registro = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select u.NOMBRE, g.COD_GASTO, g.RUT_USUARIO ,g.FECHA,g.MONTO,g.DESCRIPCION "
                    + " from GASTOS g join USUARIOS u using (RUT_USUARIO)"
                    + "  where COD_GASTO = ? order by COD_GASTO"; // idx :1
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, codigo);
            resultado = sentencia.executeQuery();

            if (resultado.next()) {
                registro = new Gastos();

                registro.setMonto(resultado.getInt("MONTO"));
                registro.setFecha(resultado.getDate("FECHA"));
                registro.setRutUsuario(resultado.getInt("RUT_USUARIO"));
                registro.setDescripcion(resultado.getString("DESCRIPCION"));
                registro.setNombreUsu(resultado.getString("NOMBRE"));
                registro.setCodGasto(resultado.getInt("COD_GASTO"));

            }

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("gastosDAO.buscar: " + codigo, ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }

    public Collection<Gastos> buscarPorRut(int rut) {
        Collection<Gastos> lista = new ArrayList<Gastos>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select u.NOMBRE, g.COD_GASTO, g.RUT_USUARIO ,g.FECHA,g.MONTO,g.DESCRIPCION "
                    + " from GASTOS g join USUARIOS u using (RUT_USUARIO)"
                    + "  where RUT_USUARIO = ? order by COD_GASTO";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, rut);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Gastos registro = new Gastos();

                    registro.setMonto(resultado.getInt("MONTO"));
                    registro.setFecha(resultado.getDate("FECHA"));
                    registro.setRutUsuario(resultado.getInt("RUT_USUARIO"));
                    registro.setDescripcion(resultado.getString("DESCRIPCION"));
                    registro.setNombreUsu(resultado.getString("NOMBRE"));
                    registro.setCodGasto(resultado.getInt("COD_GASTO"));
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al buscar gastos", ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public Collection<Gastos> buscarTodos() {
        Collection<Gastos> lista = new ArrayList<Gastos>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select u.NOMBRE, g.COD_GASTO, g.RUT_USUARIO ,g.FECHA,g.MONTO,g.DESCRIPCION "
                    + " from GASTOS g join USUARIOS u using (RUT_USUARIO)"
                    + " order by COD_GASTO";
            sentencia = conexion.prepareStatement(sql);
            System.out.println(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Gastos registro = new Gastos();
                    registro.setMonto(resultado.getInt("MONTO"));
                    registro.setFecha(resultado.getDate("FECHA"));
                    registro.setRutUsuario(resultado.getInt("RUT_USUARIO"));
                    registro.setDescripcion(resultado.getString("DESCRIPCION"));
                    registro.setNombreUsu(resultado.getString("NOMBRE"));
                    registro.setCodGasto(resultado.getInt("COD_GASTO"));
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al buscar todos los gastos", ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public void Insertar(Gastos anu) {
        PreparedStatement sentencia = null;

        try {
            String obs = anu.getDescripcion();
            int monto = anu.getMonto();
            int rutUsu = anu.getRutUsuario();
            Date fecha = anu.getFecha();
            int cod = anu.getCodGasto();
            java.sql.Date date = new java.sql.Date(fecha.getTime());

            String sql = "insert into GASTOS (COD_GASTO,RUT_USUARIO,FECHA,MONTO,DESCRIPCION) values(?,?,?,?,?)";
            sentencia = conexion.prepareStatement(sql);

            sentencia.setInt(1, cod);
            sentencia.setInt(2, rutUsu);
            sentencia.setDate(3, date);
            sentencia.setInt(4, monto);
            sentencia.setString(5, obs);

            sentencia.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al insertar gasto", ex);
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }

    int getCodGas() {
        PreparedStatement sentencia;
        int codigo = 0;
        ResultSet resultado;
        try {
            String sql = "SELECT MAX(COD_GASTO) AS CODIGO FROM GASTOS";
            sentencia = conexion.prepareStatement(sql);

            resultado = sentencia.executeQuery();
            if (resultado.next()) {
                codigo = (resultado.getInt("CODIGO") + 1);

            }

        } catch (SQLException ex) {
            throw new RuntimeException("error al obtener codAnu", ex);
        }
        return codigo;
    }

    void eliminar(int codigo) {
        PreparedStatement sentencia = null;
        try {
            String sql = "DELETE FROM GASTOS  WHERE  COD_GASTO = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, codigo);
            sentencia.executeUpdate();

        } catch (SQLException ex) {
            throw new RuntimeException("error al eliminar GASTO", ex);
        }finally{
            try {
                sentencia.close();
            } catch (SQLException ex) {
                Logger.getLogger(GastosDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    }
    
    }
